同步發佈於 Github repo
Given a linked list, determine if it has a cycle in it.
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
const hasCycle = head => {
  if(head === null || head.next === null) {
    return false;
  }
  
  let fast = head.next;
  let slow = head;
  
  while(fast !== slow) {
    if(fast === null || fast.next === null) {
      return false;
    }
    
    fast = fast.next.next;
    slow = slow.next;
  }
  
  return true;
};
今天是第十天,又要進入下一個主題囉~
這次的主題是 Linked List , Linked List 是個能快速方便地動態新增和刪除的資料結構,與陣列不同的是, Linked List 的元素在記憶體中是不連續的,而陣列是連續的,
每個節點(node)都是由一個資料(data)和一個指向下一個節點的指標(next pointer)組成,
在 JavaScript 中, Linked List 通常是以 class 或 function 實作的。
今天的題目很簡單,難度只有 Easy,
題意很言簡意賅,給一個 Linked List,然後確認有沒有 cycle 在裡面,
我們使用 雙指標追擊法 來解決這題,詳細步驟將在下面說明~
fast 一次走兩步,slow 一次走一步, fast 永遠會追擊著慢指針 slow,cycle 的話, fast 會追上 slow ,fast = head.next; slow = head;。let fast = head.next;
let slow = head;
Linked List 沒有 cycle 的話,那 fast 會遇到 null, return false 。Linked List 有 cycle 的話,那 fast 一定會遇到 slow,並且 fast 已經超過 slow 一整圈, return true。while(fast !== slow) {
  if(fast === null || fast.next === null) {
    return false;
  }
    
  fast = fast.next.next;
  slow = slow.next;
}
  
return true;